package com.holystone.splunk.utils;

import org.apache.poi.hssf.usermodel.*;
import org.codehaus.jackson.JsonNode;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * Copyright (c) 2017, HOLYSTONE Technologies, Inc.
 * All right reserved.
 *
 * @author huyan
 * @date 2017/11/23
 * @desc:
 */
public class FileUtils {

    /**
     * 封装excel表格
     * @param jsonMap 封装数据的map类 Map<String, List<JsonNode>>
     *      String:告警名称_告警触发时间：作为excel表格的sheet名称
     *      List<JsonNode>:sheet数据
     * @param path
     * @return
     * @throws FileNotFoundException
     */
    public static File getExcelFile(Map<String, List<JsonNode>> jsonMap, String path) throws FileNotFoundException {
        if (jsonMap == null || jsonMap.size() == 0) {
            return null;
        }
        // 第一步，创建一个webbook，对应一个Excel文件
        HSSFWorkbook excel = new HSSFWorkbook();
        for (String sheetName : jsonMap.keySet()) {
            List<JsonNode> jsonList = jsonMap.get(sheetName);
            if (jsonList == null || jsonList.size() == 0) {
                continue;
            }
            // 第二步，在webbook中添加一个sheet,对应Excel文件中的sheet
            HSSFSheet sheet = excel.createSheet(sheetName);
            // 第三步，在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
            HSSFRow row = sheet.createRow(0);
            // 第四步，创建单元格，并设置值表头 设置表头居中
            HSSFCellStyle style = excel.createCellStyle();
            style.setAlignment(HSSFCellStyle.ALIGN_LEFT); // 创建一个居左

            // 遍历json取出所有值不为空的字段，赋为表头
            JsonNode json = jsonList.get(0);
            Iterator<String> names = json.getFieldNames();
            int index= 0;
            HSSFCell cell = null; //表头
            String[] title = new String[json.size()];// 记录值不为空的表头
            while (names.hasNext()) {
                String name = names.next();
                JsonNode value = json.get(name);
                if (value != null && value.asText() != "") {
                    title[index] = name;
                    cell = row.createCell(index);
                    cell.setCellValue(name);
                    cell.setCellStyle(style);
                    index++;
                }
            }
            // 表值
            for (int i = 0; i < jsonList.size(); i++) {
                row = sheet.createRow(i + 1);
                JsonNode jsonNode = jsonList.get(i);
                if (jsonNode != null) {
                    for (int j = 0; j < title.length; j++) {
                        String name = title[j];
                        row.createCell(j).setCellValue(jsonNode.get(name) != null ? jsonNode.get(name).asText() : "");
                    }
                }
            }
        }
        // 存文件
        File file = new File(path);
        FileOutputStream fos = new FileOutputStream(file);
        try {
            excel.write(fos);
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return file;
    }
}
